import { observable, action, isObservable, extendObservable } from 'mobx';
import Utils from 'common/utils';

/**
 * Base
 */
export default class Base {
  // 唯一ID
  id = Utils.guid();

  label = '';

  type = '';

  // 父级对象
  parent = null;

  @observable title = '';

  // 是否选中
  @observable selected = false;

  /**
   * 统一构造方法
   */
  constructor(props = {}) {
    // 扩展属性
    Object.keys(props).map(key => {
      this[key] = props[key];
    });
  }

  /**
   * 初始化
   * @param props 需要扩展的属性
   * @param observableProps 需要扩展的 observable 属性
   * @param observableData 需要灌装的数据
   */
  @action init({ props = {}, observableProps = null, observableData = null }) {
    // 扩展属性
    Object.keys(props).map(key => {
      this[key] = props[key];
    });

    // 或者 observable 属性
    if (observableProps) {
      // console.log(observableProps);
      extendObservable(this, observableProps);
    }

    // 灌装的数据
    if (observableData) {
      this.update(observableData);
    }

    if (!this.type || !this.label) {
      throw new Error('zhang : miss type or label');
    }

    if (!this.title) {
      this.title = `${this.label}_${this.id}`;
    }
  }

  @action update(key, val) {
    if (typeof key === 'object') {
      const keys = Object.keys(key);
      keys.forEach(k => {
        const v = key[k];
        this.update(k, v);
      });
    } else {
      if (isObservable(this, key)) {
        // console.log(key, val);
        this[key] = val;
      } else {
        console.warn(`warning! '${key}' is not observable!`); // 不允许更新非监听状态的键值
      }
    }
  }

}
